python写入文件

python 写入文件
2023 年 2 月 13 日
9:39

写入 csv 出现多余空行

问题描述

Python 中的 csv 的 writer,打开文件的时候,要小心,
要通过 binary 模式去打开,即带 b 的,比如 wb,ab+ 等
而不能通过文本模式,即不带 b 的方式,w,w+,a+ 等,否则,会导致使用 writerow 写内容到 csv 中时,产生对于的 CR,导致多余的空行。

解决方式

open 中,加上 newline = ''

f = open(str(base_dir) + str(uri), 'w', encoding='utf-8', newline='')
# 2. 基于文件对象构建 csv 写入对象
# 3. 构建列表头
csv_write = csv.DictWriter(f, fieldnames=fieldnames)
csv_write.writeheader()
for row in rows:
csv_write.writerow(row)
# 4. 写入 csv 文件内容
# 5. 关闭文件
f.close()

csv 转 excel

Openpyxl

def csv_to_excel(self,csv_url,excel_url,encode='utf-8'):
""" 将 csv 转为 excel(.xlsx 格式)
如果不需要可以把计时相关代码删除
Args:
sourcePath:str 来源文件路径
savePath:str 保存文件路径,需要包含保存的文件名,文件名需要是 xlsx 格式的
encode='utf-8' 默认编码,可以改为需要的编码如 gbk
"""
import csv
try:
print('csv to excel %s' % csv_url)
curr_time = datetime.datetime.now()
print(curr_time)

f = csv.reader(open(csv_url,encoding='utf-8'))

# 创建一个 workbook 设置编码
workbook = Workbook()
# 创建一个 worksheet
worksheet = workbook.active
workbook.title = 'sheet'

for line in f:
worksheet.append(line)
workbook.save(excel_url)
print('csv to excel success')
curr_time2 = datetime.datetime.now()
print(curr_time2 - curr_time)
# import time
# time.sleep(5)
except Exception as ex:
print(f"csv to excel error, ex:{ex}")

Pandas

网上搜一下一堆
很短

csv 读取第一行为列名的文件

decoded_file=file.read().decode('utf-8').splitlines()
reader=csv.DictReader(decoded_file)
For row in reader:
print(row)
此时每一个 row 都是一个字典

二进制打开和文本打开的区别

在 UNIX/Linux 平台中,用文本方式或二进制方式打开文件没有任何区别。

在 UNIX/Linux 平台中,文本文件以\n(ASCII 码为 0x0a)作为换行符号;而在 Windows 平台中,文本文件以连在一起的\r\n(\r 的 ASCII 码是 0x0d)作为换行符号。

在 Windows 平台中,如果以文本方式打开文件,当读取文件时,系统会将文件中所有的\r\n 转换成一个字符\n,如果文件中有连续的两个字节是 0x0d0a,则系统会丢弃前面的 0x0d 这个字节,只读入 0x0a。当写入文件时,系统会将\n 转换成\r\n 写入。

也就是说,如果要写入的内容中有字节为 0x0a,则在写人该字节前,系统会自动先写入一个 0x0d。因此,如果用文本方式打开二进制文件进行读写,读写的内容就可能和文件的内容有出入。

因此,用二进制方式打开文件总是最保险的。

python 写入 txt

Mode

a+ 打开并追加
ab 二进制格式打开并追加